import axios from 'axios'
import qs from 'qs'
import { REQUEST_URL, REQUEST_URLSMD } from './request.config'

/**
 * @description: axios实例
 */
const service = axios.create({
  timeout: 60000, // 请求超时时间 
  headers: {
    "Content-Type": "application/json",
  },
})


/**
 * @description: 请求拦截器
 */
service.interceptors.request.use(
  config => {
    // TODO 请求拦截处理
    if (config.method === 'get' || config.method === 'delete') config.params = config._params
    config.headers['Authorization'] = localStorage.getItem('token'); // 设置token
    return config
  },
  error => {
    console.log('请求拦截【error】', error)
    return Promise.reject(error)
  }
)


/**
 * @description: 响应拦截器
 */
service.interceptors.response.use(response => {
  // TODO 响应拦截数据处理
  // console.log('response', response)
  if(response.data.code === "incorrect_token") {
    console.error('【token不存在】');
    return Promise.reject('当前请求需要token')
  }
  // return Promise.reject('当前请求 reject')
  return response.data
})


/**
 * @description: 通用请求方法
 * @param { String } 请求地址
 * @param { Any } 请求参数
 * @param { String } 请求类型 默认get，get、post、delete、put
 * @param { Boolean } 请求URL参数选择 0 使用SMD地址 1使用Meta地址 2使用自定义地址url
 * @param { Boolean } 转换数据格式 如将url中的参数转为对象 qs.parse()，将对象转为url参数形式 qs.stringify()
 */
const request = (url, data = "", type = "get", isUrl = 0, isQs = false) => {
  if(isUrl == 0) url = `${REQUEST_URLSMD}${url}`
  if(isUrl == 1) url = `${REQUEST_URL}${url}`
  
  if(type === 'get' || type === 'delete') {
    if(isQs) {
      data = `${url}?${qs.stringify(data)}`; // 序列化对象 对象转为 ?id=123&name=zlong  传参后端接收需要decodeURIComponent转译
    } else {
      data = {_params: data}; // 使用params传参
    }
  } else if(type === 'post' || type === 'put') {
    isQs && (data = qs.stringify(data)); // 序列化对象
  } else {
    return Promise.reject({ status: 1001, message: '请求方法不符合规范' }) 
  }
  // 请求
  return service[type](url, data).then(resolve => {
    return Promise.resolve(resolve);
  }).catch(error => {
    return Promise.reject(error);
  })
}
export default request


